Purpose

The purpose of this analysis is to assess significant differences in GSVA scores for each hallmark pathways. Using ANOVA and subsequent Tukey tests, we ask:

  • For each pathway, are GSVA scores significantly different across tumor_descriptor? If so, which timepoints are significantly different?

We perform this using both GSVA scores calculated from RNA-seq libraries. Code is also flexible enough to test a different variable besides tumor_descriptor, etc.

Plots are inspired from here: https://yulab-smu.top/biomedical-knowledge-mining-book/enrichplot.html

Usage

To run this from the command line, use:

Rscript -e "rmarkdown::render('02-model-gsea-transcriptomic-pairs.Rmd', clean = TRUE)" 

This assumes you are in the top directory of the repository.

Setup

Load libraries and define certain constants:

suppressPackageStartupMessages({
  library(tidyverse)
  library(broom)
  library(ggpubr)
  library(ggrepel)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder. This will be in the project root directory.
# Use this as the root directory to ensure proper sourcing of functions
# no matter where this is called from.
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
analysis_dir <- file.path(root_dir, "analyses", "gene-set-enrichment-analysis") 
input_dir <- file.path(analysis_dir, "input")
files_dir <- file.path(root_dir, "analyses", "sample-distribution-analysis", "results")

# Input files
## Metadata file (histologies/clinical data)
metadata_file <- file.path(files_dir, "pbta.tsv") # file from add-sample-distribution module
matched_transcriptomic_file <- file.path(files_dir, "transcriptomic_assays_matched_time_points.tsv") # file from add-sample-distribution module

## GSEA scores
scores_file <- file.path(input_dir, "gsva_scores.tsv")

# File path to plots directory
plots_dir <-
  file.path(analysis_dir, "plots", "paired-transcriptomic")
if (!dir.exists(plots_dir)) {
  dir.create(plots_dir)
}

barplots_dir <-
  file.path(plots_dir, "barplots")
if (!dir.exists(barplots_dir)) {
  dir.create(barplots_dir)
}

dotplots_dir <-
  file.path(plots_dir, "dotplots")
if (!dir.exists(dotplots_dir)) {
  dir.create(dotplots_dir)
}

volcano_plots_dir <-
  file.path(plots_dir, "volcano_plots")
if (!dir.exists(volcano_plots_dir)) {
  dir.create(volcano_plots_dir)
}

# File path to results directory
results_dir <-
  file.path(analysis_dir, "results", "paired-transcriptomic")
if (!dir.exists(results_dir)) {
  dir.create(results_dir)
}


# Significance testing universal threshold
SIGNIFICANCE_THRESHOLD <- 0.01

# This script contains functions used to modeling GSVA scores
source(paste0(analysis_dir, "/util/hallmark_models.R"))
source(paste0(analysis_dir, "/util/function-create-plots.R"))
source(paste0(root_dir, "/figures/scripts/theme.R"))

Read in data and process

######## Load input files
pbta <- readr::read_tsv(metadata_file, guess_max = 100000) %>% 
  filter(experimental_strategy == "RNA-Seq") %>% 
  filter(!is.na(RNA_library))
Rows: 4542 Columns: 62── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (38): Kids_First_Participant_ID, cg_multiple, cg_id, Kids_First_Biospecimen_ID, sample_id, aliquot_id, experimental_strat...
dbl (10): age_at_diagnosis_days, OS_days, EFS_days, age_last_update_days, normal_fraction, tumor_fraction, tumor_ploidy, age_...
lgl (14): gtex_group, gtex_subgroup, cell_line_composition, cell_line_passage, tumor_fraction_RFpurify_ABSOLUTE, tumor_fracti...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Read in matched_transcriptomic_file and get the list of patients 
# with matched time points for the transcriptomic assays
patient_list <- readr::read_tsv(matched_transcriptomic_file, guess_max = 100000, show_col_types = FALSE) %>%
  subset(select = c("Kids_First_Participant_ID", "descriptors"))

#patient_list <- readr::read_tsv(matched_transcriptomic_file, guess_max = 100000, show_col_types = FALSE) %>%
#  subset(select = c("Kids_First_Participant_ID", "descriptors"))

# How many patients with paired assays?
print(length(unique(patient_list$Kids_First_Participant_ID)))
[1] 122
# Add metadata from pbta to patient list
metadata <- patient_list %>% 
  left_join(pbta, by = "Kids_First_Participant_ID")
Warning: Detected an unexpected many-to-many relationship between `x` and `y`.
# Read scores file
scores_file <- readr::read_tsv(scores_file) 
Rows: 193700 Columns: 4── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (3): Kids_First_Biospecimen_ID, hallmark_name, data_type
dbl (1): gsea_score
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Vector to order timepoints
timepoints <- c("Diagnosis", "Progressive", "Recurrence", "Deceased", "Second Malignancy", "Unavailable")

### Merge histology metadata with each set of gsea scores
metadata_with_gsva <- metadata %>%
  inner_join(scores_file, by = "Kids_First_Biospecimen_ID") %>% 
  mutate(tumor_descriptor = factor(tumor_descriptor),
         tumor_descriptor = fct_relevel(tumor_descriptor, timepoints)) %>% 
  filter(!RNA_library == "exome_capture")
Warning: Detected an unexpected many-to-many relationship between `x` and `y`.
# How many patients with paired assays?
print(length(unique(metadata_with_gsva$Kids_First_Participant_ID)))
[1] 121
# How many biospecimens per `RNA_library`?
print(table(metadata_with_gsva$RNA_library))

         poly-A poly-A stranded        stranded 
            550            8300           10950 
######## Find out unique RNA library types
rna_library_list <- metadata_with_gsva %>% pull(data_type) %>% unique()
rna_library_list <- sort(rna_library_list, decreasing = FALSE)
print(rna_library_list)
[1] "polya"          "polya_stranded" "stranded"      
######## Define output files for each unique rna library
tumor_descriptor_anova_outpaths <- lapply(rna_library_list, function(x){
  x<-gsub(" ", "_", x)
  x<-stringr::str_to_lower(gsub("-", "", x))
  file.path(results_dir, paste0("gsva_anova_", x, "_tumor_descriptor.tsv"))
})

tumor_descriptor_tukey_outpaths <- lapply(rna_library_list, function(x){
  x<-gsub(" ", "_", x)
  x<-stringr::str_to_lower(gsub("-", "", x))
  file.path(results_dir, paste0("gsva_tukey_", x, "_tumor_descriptor.tsv"))
})

ANOVA and Tukey analysis of GSVA scores

Here we perform a series of ANOVAs, for polyA and stranded libraries separately, to determine whether mean GSVA scores for a given grouping are significantly different across hallmarks (pathways). The given groupings examined here are cancer_group and tumor_descriptor. In other words, we perform an ANOVA (and associated posthoc Tukey test) for each hallmark as, hallmark ~ grouping. Users can specify the grouping variable.

for(i in 1:length(rna_library_list)){
  print(i)
  
  rna_library = rna_library_list[i]
  print(rna_library)
  # find out the number of `tumor_descriptor` with this RNA library
  tumor_descriptor_n <- metadata_with_gsva %>%
    dplyr::filter(data_type == rna_library) %>%
    dplyr::pull(tumor_descriptor) %>% 
    unique() %>% length()
  
  # anova can only be run on factors with >=2 levels, so to avoid error, we give a if statement
  if(tumor_descriptor_n>=2){
    tumor_descriptor_model_results <- gsva_anova_tukey(metadata_with_gsva, tumor_descriptor, rna_library, SIGNIFICANCE_THRESHOLD) 
  
    ###########################################################################################
   
    # write out results
    readr::write_tsv(tumor_descriptor_model_results[["anova"]], tumor_descriptor_anova_outpaths[[i]])
    readr::write_tsv(tumor_descriptor_model_results[["tukey"]], tumor_descriptor_tukey_outpaths[[i]])
  
    # print results for viewing
    print(rna_library)
    print(head(tumor_descriptor_model_results))
  
    ################ plot results ########################################################
    ###### tukey ######################################################################
    
  
    td_models <- unique(as.character(tumor_descriptor_model_results[["tukey"]]$comparison))
    td_models <- sort(td_models, decreasing = FALSE)
    print(td_models)
  
    for(t in seq_along(td_models)){
      print(t)

      # Re-order bars
      df <- tumor_descriptor_model_results[["tukey"]] %>%
        filter(comparison == td_models[t]) %>% 
        mutate(hallmark_name_id = paste0(hallmark_name, 1:50))
  
      df$hallmark_name <- factor(df$hallmark_name,
                                 levels = rev(unique(df$hallmark_name[order(df$tukey_p_value, decreasing = TRUE)]))) # Factor levels in increasing order

      ###### barplots ###########
      name <- paste0(barplots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_barplot.pdf")
      print(name)
      p <- create_barplot(df = df,
                          y_value = df$tukey_p_value,
                          title_value = "tukey_p_value",
                          rna_library = rna_library_list[i],
                          td_model_id = td_models[t])
      pdf(file = name, width = 12, height = 10)
      print(p)
      dev.off()
      
      ###### dot plots ###########
      dotplot_name <- paste0(dotplots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_dotplot.pdf")
      print(dotplot_name)
      p <- create_dotplot(df = df,
                          x_value = df$hallmark_name,
                          y_value = df$tukey_p_value,
                          title_value = "tukey_p_value",
                          rna_library = rna_library_list[i],
                          td_model_id = td_models[t])
      pdf(file = dotplot_name, width = 12, height = 10)
      print(p)
      dev.off()
      
      ###### volcano plots ###########
      # The significantly differentially pathways are the ones found in the upper-left and upper-right corners.
      # Add a column to the data frame to specify if they are UP- or DOWN- regulated (pathway_score_difference respectively positive or negative)

      # add a new column 
      df$path_diff <- "NO"
      # if pathway_score_difference > 0 and tukey_p_value < 0.05, set as "UP" 
      df$path_diff[df$pathway_score_difference > 0 & df$tukey_p_value < 0.05] <- "top_ranked_data"
      # if pathway_score_difference < 0 and tukey_p_value < 0.05, set as "DOWN"
      df$path_diff[df$pathway_score_difference < 0 & df$tukey_p_value < 0.05] <- "bottom_ranked_data"
      # Create labels
      df$labels <- with(df, ifelse(tukey_p_value < 0.05, hallmark_name_id, ""))
      
      volcano_name <- paste0(volcano_plots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_volcano_plot.pdf")
      print(volcano_name)
      p <- create_volcano_plot(df = df,
                               title_value = "tukey_p_value",
                               rna_library = rna_library_list[i],
                               td_model_id = td_models[t])
      pdf(file = volcano_name, width = 12, height = 10)
      print(p)
      dev.off()
      
      
      
    }
    
    ###### anova ######################################################################
    ###### barplots ###########    
    name <- paste0(barplots_dir, "/", "gsva_anova_", rna_library_list[i], "-tumor_descriptor_barplot.pdf")
    print(name)
  
    # Re-order bars
    df <- tumor_descriptor_model_results[["anova"]]
    df$hallmark_name <- factor(df$hallmark_name,
                               levels = rev(unique(df$hallmark_name[order(df$anova_p_value, decreasing = TRUE)]))) # Factor levels in increasing order
    p <- create_barplot(df = df,
                        y_value = df$anova_p_value,
                        title_value = "anova_p_value", 
                        rna_library = rna_library_list[i],
                        td_model_id = NULL)
    pdf(file = name, width = 12, height = 10)
    print(p)
    dev.off()
  
    ###### dot plots ###########
    dotplot_name <- paste0(dotplots_dir, "/", "gsva_anova_", rna_library, "-tumor_descriptor_dotplot.pdf")
    print(dotplot_name)
    p <- create_dotplot(df = tumor_descriptor_model_results[["anova"]],
                        x_value = tumor_descriptor_model_results[["anova"]]$hallmark_name,
                        y_value = tumor_descriptor_model_results[["anova"]]$anova_p_value,
                        title_value = "anova_p_value",
                        rna_library = rna_library_list[i],
                        td_model_id = NULL)
    pdf(file = dotplot_name, width = 12, height = 10)
    print(p)
    dev.off()
    }
}
for(i in 1:length(rna_library_list)){
  print(i)
  
  rna_library = rna_library_list[i]
  print(rna_library)
  # find out the number of `tumor_descriptor` with this RNA library
  tumor_descriptor_n <- metadata_with_gsva %>%
    dplyr::filter(data_type == rna_library) %>%
    dplyr::pull(tumor_descriptor) %>% 
    unique() %>% length()
  
  # anova can only be run on factors with >=2 levels, so to avoid error, we give a if statement
  if(tumor_descriptor_n>=2){
    tumor_descriptor_model_results <- gsva_anova_tukey(metadata_with_gsva, tumor_descriptor, rna_library, SIGNIFICANCE_THRESHOLD) 
  
    ###########################################################################################
   
    # write out results
    readr::write_tsv(tumor_descriptor_model_results[["anova"]], tumor_descriptor_anova_outpaths[[i]])
    readr::write_tsv(tumor_descriptor_model_results[["tukey"]], tumor_descriptor_tukey_outpaths[[i]])
  
    # print results for viewing
    print(rna_library)
    print(head(tumor_descriptor_model_results))
  
    ################ plot results ########################################################
    ###### tukey ######################################################################
    
  
    td_models <- unique(as.character(tumor_descriptor_model_results[["tukey"]]$comparison))
    td_models <- sort(td_models, decreasing = FALSE)
    print(td_models)
  
    for(t in seq_along(td_models)){
      print(t)

      # Re-order bars
      df <- tumor_descriptor_model_results[["tukey"]] %>%
        filter(comparison == td_models[t]) %>% 
        mutate(hallmark_name_id = paste0(hallmark_name, 1:50))
  
      df$hallmark_name <- factor(df$hallmark_name,
                                 levels = rev(unique(df$hallmark_name[order(df$tukey_p_value, decreasing = TRUE)]))) # Factor levels in increasing order

      ###### barplots ###########
      name <- paste0(barplots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_barplot.pdf")
      print(name)
      p <- create_barplot(df = df,
                          y_value = df$tukey_p_value,
                          title_value = "tukey_p_value",
                          rna_library = rna_library_list[i],
                          td_model_id = td_models[t])
      pdf(file = name, width = 12, height = 10)
      print(p)
      dev.off()
      
      ###### dot plots ###########
      dotplot_name <- paste0(dotplots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_dotplot.pdf")
      print(dotplot_name)
      p <- create_dotplot(df = df,
                          x_value = df$hallmark_name,
                          y_value = df$tukey_p_value,
                          title_value = "tukey_p_value",
                          rna_library = rna_library_list[i],
                          td_model_id = td_models[t])
      pdf(file = dotplot_name, width = 12, height = 10)
      print(p)
      dev.off()
      
      ###### volcano plots ###########
      # The significantly differentially pathways are the ones found in the upper-left and upper-right corners.
      # Add a column to the data frame to specify if they are UP- or DOWN- regulated (pathway_score_difference respectively positive or negative)

      # add a new column 
      df$path_diff <- "NO"
      # if pathway_score_difference > 0 and tukey_p_value < 0.05, set as "UP" 
      df$path_diff[df$pathway_score_difference > 0 & df$tukey_p_value < 0.05] <- "top_ranked_data"
      # if pathway_score_difference < 0 and tukey_p_value < 0.05, set as "DOWN"
      df$path_diff[df$pathway_score_difference < 0 & df$tukey_p_value < 0.05] <- "bottom_ranked_data"
      # Create labels
      df$labels <- with(df, ifelse(tukey_p_value < 0.05, hallmark_name_id, ""))
      
      volcano_name <- paste0(volcano_plots_dir, "/", "gsva_tukey_", rna_library_list[i], "-", td_models[t], "-tumor_descriptor_volcano_plot.pdf")
      print(volcano_name)
      p <- create_volcano_plot(df = df,
                               title_value = "tukey_p_value",
                               rna_library = rna_library_list[i],
                               td_model_id = td_models[t])
      pdf(file = volcano_name, width = 12, height = 10)
      print(p)
      dev.off()
      
      
      
    }
    
    ###### anova ######################################################################
    ###### barplots ###########    
    name <- paste0(barplots_dir, "/", "gsva_anova_", rna_library_list[i], "-tumor_descriptor_barplot.pdf")
    print(name)
  
    # Re-order bars
    df <- tumor_descriptor_model_results[["anova"]]
    df$hallmark_name <- factor(df$hallmark_name,
                               levels = rev(unique(df$hallmark_name[order(df$anova_p_value, decreasing = TRUE)]))) # Factor levels in increasing order
    p <- create_barplot(df = df,
                        y_value = df$anova_p_value,
                        title_value = "anova_p_value", 
                        rna_library = rna_library_list[i],
                        td_model_id = NULL)
    pdf(file = name, width = 12, height = 10)
    print(p)
    dev.off()
  
    ###### dot plots ###########
    dotplot_name <- paste0(dotplots_dir, "/", "gsva_anova_", rna_library, "-tumor_descriptor_dotplot.pdf")
    print(dotplot_name)
    p <- create_dotplot(df = tumor_descriptor_model_results[["anova"]],
                        x_value = tumor_descriptor_model_results[["anova"]]$hallmark_name,
                        y_value = tumor_descriptor_model_results[["anova"]]$anova_p_value,
                        title_value = "anova_p_value",
                        rna_library = rna_library_list[i],
                        td_model_id = NULL)
    pdf(file = dotplot_name, width = 12, height = 10)
    print(p)
    dev.off()
    }
}
[1] 1
[1] "polya"
[1] 50
[1] "polya"
$anova

$tukey

[1] "Progressive-Diagnosis"
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya-Progressive-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya-Progressive-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya-Progressive-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_anova_polya-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_anova_polya-tumor_descriptor_dotplot.pdf"
[1] 2
[1] "polya_stranded"
[1] 50
[1] "polya_stranded"
$anova

$tukey

 [1] "Deceased-Diagnosis"            "Deceased-Progressive"          "Deceased-Recurrence"          
 [4] "Progressive-Diagnosis"         "Recurrence-Diagnosis"          "Recurrence-Progressive"       
 [7] "Second Malignancy-Deceased"    "Second Malignancy-Diagnosis"   "Second Malignancy-Progressive"
[10] "Second Malignancy-Recurrence" 
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Deceased-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Deceased-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Deceased-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Deceased-Progressive-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Deceased-Progressive-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Deceased-Progressive-tumor_descriptor_volcano_plot.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Deceased-Recurrence-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Deceased-Recurrence-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Deceased-Recurrence-tumor_descriptor_volcano_plot.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Progressive-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Progressive-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Progressive-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Recurrence-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Recurrence-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Recurrence-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Recurrence-Progressive-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Recurrence-Progressive-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Recurrence-Progressive-tumor_descriptor_volcano_plot.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Second Malignancy-Deceased-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Second Malignancy-Deceased-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Second Malignancy-Deceased-tumor_descriptor_volcano_plot.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Second Malignancy-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Second Malignancy-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Second Malignancy-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Second Malignancy-Progressive-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Second Malignancy-Progressive-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Second Malignancy-Progressive-tumor_descriptor_volcano_plot.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_polya_stranded-Second Malignancy-Recurrence-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_polya_stranded-Second Malignancy-Recurrence-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_polya_stranded-Second Malignancy-Recurrence-tumor_descriptor_volcano_plot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_anova_polya_stranded-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_anova_polya_stranded-tumor_descriptor_dotplot.pdf"
[1] 3
[1] "stranded"
[1] 50
[1] "stranded"
$anova

$tukey

 [1] "Deceased-Diagnosis"            "Deceased-Progressive"          "Deceased-Recurrence"          
 [4] "Progressive-Diagnosis"         "Recurrence-Diagnosis"          "Recurrence-Progressive"       
 [7] "Second Malignancy-Deceased"    "Second Malignancy-Diagnosis"   "Second Malignancy-Progressive"
[10] "Second Malignancy-Recurrence"  "Unavailable-Deceased"          "Unavailable-Diagnosis"        
[13] "Unavailable-Progressive"       "Unavailable-Recurrence"        "Unavailable-Second Malignancy"
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Deceased-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Deceased-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Deceased-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Deceased-Progressive-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Deceased-Progressive-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Deceased-Progressive-tumor_descriptor_volcano_plot.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Deceased-Recurrence-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Deceased-Recurrence-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Deceased-Recurrence-tumor_descriptor_volcano_plot.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Progressive-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Progressive-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Progressive-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Recurrence-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Recurrence-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Recurrence-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Recurrence-Progressive-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Recurrence-Progressive-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Recurrence-Progressive-tumor_descriptor_volcano_plot.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Second Malignancy-Deceased-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Second Malignancy-Deceased-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Second Malignancy-Deceased-tumor_descriptor_volcano_plot.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Second Malignancy-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Second Malignancy-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Second Malignancy-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Second Malignancy-Progressive-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Second Malignancy-Progressive-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Second Malignancy-Progressive-tumor_descriptor_volcano_plot.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Second Malignancy-Recurrence-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Second Malignancy-Recurrence-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Second Malignancy-Recurrence-tumor_descriptor_volcano_plot.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Unavailable-Deceased-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Unavailable-Deceased-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Unavailable-Deceased-tumor_descriptor_volcano_plot.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Unavailable-Diagnosis-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Unavailable-Diagnosis-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Unavailable-Diagnosis-tumor_descriptor_volcano_plot.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Unavailable-Progressive-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Unavailable-Progressive-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Unavailable-Progressive-tumor_descriptor_volcano_plot.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Unavailable-Recurrence-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Unavailable-Recurrence-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Unavailable-Recurrence-tumor_descriptor_volcano_plot.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_tukey_stranded-Unavailable-Second Malignancy-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_tukey_stranded-Unavailable-Second Malignancy-tumor_descriptor_dotplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/volcano_plots/gsva_tukey_stranded-Unavailable-Second Malignancy-tumor_descriptor_volcano_plot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/barplots/gsva_anova_stranded-tumor_descriptor_barplot.pdf"
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/gene-set-enrichment-analysis/plots/paired-transcriptomic/dotplots/gsva_anova_stranded-tumor_descriptor_dotplot.pdf"

LS0tCnRpdGxlOiAiR1NWQSBTY29yZSBNb2RlbGluZyIKYXV0aG9yOiAiQW50b25pYSBDaHJvbmkgPGNocm9uaWFAY2hvcC5lZHU+IGZvciBEM0IiCmRhdGU6ICIyMDIzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCi0tLQoKIyMjIFB1cnBvc2UKClRoZSBwdXJwb3NlIG9mIHRoaXMgYW5hbHlzaXMgaXMgdG8gYXNzZXNzIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIEdTVkEgc2NvcmVzIGZvciBlYWNoIGhhbGxtYXJrIHBhdGh3YXlzLiBVc2luZyBBTk9WQSBhbmQgc3Vic2VxdWVudCBUdWtleSB0ZXN0cywgd2UgYXNrOgoKKyBGb3IgZWFjaCBwYXRod2F5LCBhcmUgR1NWQSBzY29yZXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgYWNyb3NzIGB0dW1vcl9kZXNjcmlwdG9yYD8gSWYgc28sIHdoaWNoIHRpbWVwb2ludHMgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50PwoKV2UgcGVyZm9ybSB0aGlzIHVzaW5nIGJvdGggR1NWQSBzY29yZXMgY2FsY3VsYXRlZCBmcm9tIFJOQS1zZXEgbGlicmFyaWVzLiBDb2RlIGlzIGFsc28gZmxleGlibGUgZW5vdWdoIHRvIHRlc3QgYSBkaWZmZXJlbnQgdmFyaWFibGUgYmVzaWRlcyBgdHVtb3JfZGVzY3JpcHRvcmAsIGV0Yy4KCgpQbG90cyBhcmUgaW5zcGlyZWQgZnJvbSBoZXJlOiBodHRwczovL3l1bGFiLXNtdS50b3AvYmlvbWVkaWNhbC1rbm93bGVkZ2UtbWluaW5nLWJvb2svZW5yaWNocGxvdC5odG1sCgojIyMgVXNhZ2UKClRvIHJ1biB0aGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdXNlOgpgYGAKUnNjcmlwdCAtZSAicm1hcmtkb3duOjpyZW5kZXIoJzAyLW1vZGVsLWdzZWEtdHJhbnNjcmlwdG9taWMtcGFpcnMuUm1kJywgY2xlYW4gPSBUUlVFKSIgCmBgYApfVGhpcyBhc3N1bWVzIHlvdSBhcmUgaW4gdGhlIHRvcCBkaXJlY3Rvcnkgb2YgdGhlIHJlcG9zaXRvcnkuXwoKIyBTZXR1cAoKTG9hZCBsaWJyYXJpZXMgYW5kIGRlZmluZSBjZXJ0YWluIGNvbnN0YW50czoKCmBgYHtyIGxvYWQtbGlicmFyeX0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KHRpZHl2ZXJzZSkKICBsaWJyYXJ5KGJyb29tKQogIGxpYnJhcnkoZ2dwdWJyKQogIGxpYnJhcnkoZ2dyZXBlbCkKfSkKYGBgCgoKIyMgRGlyZWN0b3JpZXMgYW5kIEZpbGUgSW5wdXRzL091dHB1dHMKCmBgYHtyIHNldC1kaXItYW5kLWZpbGUtbmFtZXN9CiMgRGV0ZWN0IHRoZSAiLmdpdCIgZm9sZGVyLiBUaGlzIHdpbGwgYmUgaW4gdGhlIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuCiMgVXNlIHRoaXMgYXMgdGhlIHJvb3QgZGlyZWN0b3J5IHRvIGVuc3VyZSBwcm9wZXIgc291cmNpbmcgb2YgZnVuY3Rpb25zCiMgbm8gbWF0dGVyIHdoZXJlIHRoaXMgaXMgY2FsbGVkIGZyb20uCnJvb3RfZGlyIDwtIHJwcm9qcm9vdDo6ZmluZF9yb290KHJwcm9qcm9vdDo6aGFzX2RpcigiLmdpdCIpKQphbmFseXNpc19kaXIgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAiZ2VuZS1zZXQtZW5yaWNobWVudC1hbmFseXNpcyIpIAppbnB1dF9kaXIgPC0gZmlsZS5wYXRoKGFuYWx5c2lzX2RpciwgImlucHV0IikKZmlsZXNfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgImFuYWx5c2VzIiwgInNhbXBsZS1kaXN0cmlidXRpb24tYW5hbHlzaXMiLCAicmVzdWx0cyIpCgojIElucHV0IGZpbGVzCiMjIE1ldGFkYXRhIGZpbGUgKGhpc3RvbG9naWVzL2NsaW5pY2FsIGRhdGEpCm1ldGFkYXRhX2ZpbGUgPC0gZmlsZS5wYXRoKGZpbGVzX2RpciwgInBidGEudHN2IikgIyBmaWxlIGZyb20gYWRkLXNhbXBsZS1kaXN0cmlidXRpb24gbW9kdWxlCm1hdGNoZWRfdHJhbnNjcmlwdG9taWNfZmlsZSA8LSBmaWxlLnBhdGgoZmlsZXNfZGlyLCAidHJhbnNjcmlwdG9taWNfYXNzYXlzX21hdGNoZWRfdGltZV9wb2ludHMudHN2IikgIyBmaWxlIGZyb20gYWRkLXNhbXBsZS1kaXN0cmlidXRpb24gbW9kdWxlCgojIyBHU0VBIHNjb3JlcwpzY29yZXNfZmlsZSA8LSBmaWxlLnBhdGgoaW5wdXRfZGlyLCAiZ3N2YV9zY29yZXMudHN2IikKCiMgRmlsZSBwYXRoIHRvIHBsb3RzIGRpcmVjdG9yeQpwbG90c19kaXIgPC0KICBmaWxlLnBhdGgoYW5hbHlzaXNfZGlyLCAicGxvdHMiLCAicGFpcmVkLXRyYW5zY3JpcHRvbWljIikKaWYgKCFkaXIuZXhpc3RzKHBsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKHBsb3RzX2RpcikKfQoKYmFycGxvdHNfZGlyIDwtCiAgZmlsZS5wYXRoKHBsb3RzX2RpciwgImJhcnBsb3RzIikKaWYgKCFkaXIuZXhpc3RzKGJhcnBsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKGJhcnBsb3RzX2RpcikKfQoKZG90cGxvdHNfZGlyIDwtCiAgZmlsZS5wYXRoKHBsb3RzX2RpciwgImRvdHBsb3RzIikKaWYgKCFkaXIuZXhpc3RzKGRvdHBsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKGRvdHBsb3RzX2RpcikKfQoKdm9sY2Fub19wbG90c19kaXIgPC0KICBmaWxlLnBhdGgocGxvdHNfZGlyLCAidm9sY2Fub19wbG90cyIpCmlmICghZGlyLmV4aXN0cyh2b2xjYW5vX3Bsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKHZvbGNhbm9fcGxvdHNfZGlyKQp9CgojIEZpbGUgcGF0aCB0byByZXN1bHRzIGRpcmVjdG9yeQpyZXN1bHRzX2RpciA8LQogIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJyZXN1bHRzIiwgInBhaXJlZC10cmFuc2NyaXB0b21pYyIpCmlmICghZGlyLmV4aXN0cyhyZXN1bHRzX2RpcikpIHsKICBkaXIuY3JlYXRlKHJlc3VsdHNfZGlyKQp9CgoKIyBTaWduaWZpY2FuY2UgdGVzdGluZyB1bml2ZXJzYWwgdGhyZXNob2xkClNJR05JRklDQU5DRV9USFJFU0hPTEQgPC0gMC4wMQoKIyBUaGlzIHNjcmlwdCBjb250YWlucyBmdW5jdGlvbnMgdXNlZCB0byBtb2RlbGluZyBHU1ZBIHNjb3Jlcwpzb3VyY2UocGFzdGUwKGFuYWx5c2lzX2RpciwgIi91dGlsL2hhbGxtYXJrX21vZGVscy5SIikpCnNvdXJjZShwYXN0ZTAoYW5hbHlzaXNfZGlyLCAiL3V0aWwvZnVuY3Rpb24tY3JlYXRlLXBsb3RzLlIiKSkKc291cmNlKHBhc3RlMChyb290X2RpciwgIi9maWd1cmVzL3NjcmlwdHMvdGhlbWUuUiIpKQpgYGAKCiMjIFJlYWQgaW4gZGF0YSBhbmQgcHJvY2VzcwoKYGBge3IgcmVhZC1pbnB1dC1maWxlc30KIyMjIyMjIyMgTG9hZCBpbnB1dCBmaWxlcwpwYnRhIDwtIHJlYWRyOjpyZWFkX3RzdihtZXRhZGF0YV9maWxlLCBndWVzc19tYXggPSAxMDAwMDApICU+JSAKICBmaWx0ZXIoZXhwZXJpbWVudGFsX3N0cmF0ZWd5ID09ICJSTkEtU2VxIikgJT4lIAogIGZpbHRlcighaXMubmEoUk5BX2xpYnJhcnkpKQoKIyBSZWFkIGluIG1hdGNoZWRfdHJhbnNjcmlwdG9taWNfZmlsZSBhbmQgZ2V0IHRoZSBsaXN0IG9mIHBhdGllbnRzIAojIHdpdGggbWF0Y2hlZCB0aW1lIHBvaW50cyBmb3IgdGhlIHRyYW5zY3JpcHRvbWljIGFzc2F5cwpwYXRpZW50X2xpc3QgPC0gcmVhZHI6OnJlYWRfdHN2KG1hdGNoZWRfdHJhbnNjcmlwdG9taWNfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAlPiUKICBzdWJzZXQoc2VsZWN0ID0gYygiS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCIsICJkZXNjcmlwdG9ycyIpKQoKI3BhdGllbnRfbGlzdCA8LSByZWFkcjo6cmVhZF90c3YobWF0Y2hlZF90cmFuc2NyaXB0b21pY19maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JQojICBzdWJzZXQoc2VsZWN0ID0gYygiS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCIsICJkZXNjcmlwdG9ycyIpKQoKIyBIb3cgbWFueSBwYXRpZW50cyB3aXRoIHBhaXJlZCBhc3NheXM/CnByaW50KGxlbmd0aCh1bmlxdWUocGF0aWVudF9saXN0JEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKSkKCiMgQWRkIG1ldGFkYXRhIGZyb20gcGJ0YSB0byBwYXRpZW50IGxpc3QKbWV0YWRhdGEgPC0gcGF0aWVudF9saXN0ICU+JSAKICBsZWZ0X2pvaW4ocGJ0YSwgYnkgPSAiS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCIpCgojIFJlYWQgc2NvcmVzIGZpbGUKc2NvcmVzX2ZpbGUgPC0gcmVhZHI6OnJlYWRfdHN2KHNjb3Jlc19maWxlKSAKCiMgVmVjdG9yIHRvIG9yZGVyIHRpbWVwb2ludHMKdGltZXBvaW50cyA8LSBjKCJEaWFnbm9zaXMiLCAiUHJvZ3Jlc3NpdmUiLCAiUmVjdXJyZW5jZSIsICJEZWNlYXNlZCIsICJTZWNvbmQgTWFsaWduYW5jeSIsICJVbmF2YWlsYWJsZSIpCgojIyMgTWVyZ2UgaGlzdG9sb2d5IG1ldGFkYXRhIHdpdGggZWFjaCBzZXQgb2YgZ3NlYSBzY29yZXMKbWV0YWRhdGFfd2l0aF9nc3ZhIDwtIG1ldGFkYXRhICU+JQogIGlubmVyX2pvaW4oc2NvcmVzX2ZpbGUsIGJ5ID0gIktpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQiKSAlPiUgCiAgbXV0YXRlKHR1bW9yX2Rlc2NyaXB0b3IgPSBmYWN0b3IodHVtb3JfZGVzY3JpcHRvciksCiAgICAgICAgIHR1bW9yX2Rlc2NyaXB0b3IgPSBmY3RfcmVsZXZlbCh0dW1vcl9kZXNjcmlwdG9yLCB0aW1lcG9pbnRzKSkgJT4lIAogIGZpbHRlcighUk5BX2xpYnJhcnkgPT0gImV4b21lX2NhcHR1cmUiKQoKIyBIb3cgbWFueSBwYXRpZW50cyB3aXRoIHBhaXJlZCBhc3NheXM/CnByaW50KGxlbmd0aCh1bmlxdWUobWV0YWRhdGFfd2l0aF9nc3ZhJEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKSkKCiMgSG93IG1hbnkgYmlvc3BlY2ltZW5zIHBlciBgUk5BX2xpYnJhcnlgPwpwcmludCh0YWJsZShtZXRhZGF0YV93aXRoX2dzdmEkUk5BX2xpYnJhcnkpKQoKIyMjIyMjIyMgRmluZCBvdXQgdW5pcXVlIFJOQSBsaWJyYXJ5IHR5cGVzCnJuYV9saWJyYXJ5X2xpc3QgPC0gbWV0YWRhdGFfd2l0aF9nc3ZhICU+JSBwdWxsKGRhdGFfdHlwZSkgJT4lIHVuaXF1ZSgpCnJuYV9saWJyYXJ5X2xpc3QgPC0gc29ydChybmFfbGlicmFyeV9saXN0LCBkZWNyZWFzaW5nID0gRkFMU0UpCnByaW50KHJuYV9saWJyYXJ5X2xpc3QpCgojIyMjIyMjIyBEZWZpbmUgb3V0cHV0IGZpbGVzIGZvciBlYWNoIHVuaXF1ZSBybmEgbGlicmFyeQp0dW1vcl9kZXNjcmlwdG9yX2Fub3ZhX291dHBhdGhzIDwtIGxhcHBseShybmFfbGlicmFyeV9saXN0LCBmdW5jdGlvbih4KXsKICB4PC1nc3ViKCIgIiwgIl8iLCB4KQogIHg8LXN0cmluZ3I6OnN0cl90b19sb3dlcihnc3ViKCItIiwgIiIsIHgpKQogIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnc3ZhX2Fub3ZhXyIsIHgsICJfdHVtb3JfZGVzY3JpcHRvci50c3YiKSkKfSkKCnR1bW9yX2Rlc2NyaXB0b3JfdHVrZXlfb3V0cGF0aHMgPC0gbGFwcGx5KHJuYV9saWJyYXJ5X2xpc3QsIGZ1bmN0aW9uKHgpewogIHg8LWdzdWIoIiAiLCAiXyIsIHgpCiAgeDwtc3RyaW5ncjo6c3RyX3RvX2xvd2VyKGdzdWIoIi0iLCAiIiwgeCkpCiAgZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCBwYXN0ZTAoImdzdmFfdHVrZXlfIiwgeCwgIl90dW1vcl9kZXNjcmlwdG9yLnRzdiIpKQp9KQoKYGBgCgoKIyMjIEFOT1ZBIGFuZCBUdWtleSBhbmFseXNpcyBvZiBHU1ZBIHNjb3JlcwoKSGVyZSB3ZSBwZXJmb3JtIGEgc2VyaWVzIG9mIEFOT1ZBcywgZm9yIHBvbHlBIGFuZCBzdHJhbmRlZCBsaWJyYXJpZXMgc2VwYXJhdGVseSwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgbWVhbiBHU1ZBIHNjb3JlcyBmb3IgYSBnaXZlbiBncm91cGluZyBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgYWNyb3NzIGhhbGxtYXJrcyAocGF0aHdheXMpLiBUaGUgZ2l2ZW4gZ3JvdXBpbmdzIGV4YW1pbmVkIGhlcmUgYXJlIGBjYW5jZXJfZ3JvdXBgIGFuZCBgdHVtb3JfZGVzY3JpcHRvcmAuIApJbiBvdGhlciB3b3Jkcywgd2UgcGVyZm9ybSBhbiBBTk9WQSAoYW5kIGFzc29jaWF0ZWQgcG9zdGhvYyBUdWtleSB0ZXN0KSBmb3IgZWFjaCBoYWxsbWFyayBhcywgYGhhbGxtYXJrIH4gZ3JvdXBpbmdgLiBVc2VycyBjYW4gc3BlY2lmeSB0aGUgZ3JvdXBpbmcgdmFyaWFibGUuCgoKYGBge3IsIGFvdi1wZXJmb3JtLXBsb3QsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy5mdWxsd2lkdGggPSBUUlVFLCBlY2hvID0gVFJVRX0KZm9yKGkgaW4gMTpsZW5ndGgocm5hX2xpYnJhcnlfbGlzdCkpewogIHByaW50KGkpCiAgCiAgcm5hX2xpYnJhcnkgPSBybmFfbGlicmFyeV9saXN0W2ldCiAgcHJpbnQocm5hX2xpYnJhcnkpCiAgIyBmaW5kIG91dCB0aGUgbnVtYmVyIG9mIGB0dW1vcl9kZXNjcmlwdG9yYCB3aXRoIHRoaXMgUk5BIGxpYnJhcnkKICB0dW1vcl9kZXNjcmlwdG9yX24gPC0gbWV0YWRhdGFfd2l0aF9nc3ZhICU+JQogICAgZHBseXI6OmZpbHRlcihkYXRhX3R5cGUgPT0gcm5hX2xpYnJhcnkpICU+JQogICAgZHBseXI6OnB1bGwodHVtb3JfZGVzY3JpcHRvcikgJT4lIAogICAgdW5pcXVlKCkgJT4lIGxlbmd0aCgpCiAgCiAgIyBhbm92YSBjYW4gb25seSBiZSBydW4gb24gZmFjdG9ycyB3aXRoID49MiBsZXZlbHMsIHNvIHRvIGF2b2lkIGVycm9yLCB3ZSBnaXZlIGEgaWYgc3RhdGVtZW50CiAgaWYodHVtb3JfZGVzY3JpcHRvcl9uPj0yKXsKICAgIHR1bW9yX2Rlc2NyaXB0b3JfbW9kZWxfcmVzdWx0cyA8LSBnc3ZhX2Fub3ZhX3R1a2V5KG1ldGFkYXRhX3dpdGhfZ3N2YSwgdHVtb3JfZGVzY3JpcHRvciwgcm5hX2xpYnJhcnksIFNJR05JRklDQU5DRV9USFJFU0hPTEQpIAogIAogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAKICAgICMgd3JpdGUgb3V0IHJlc3VsdHMKICAgIHJlYWRyOjp3cml0ZV90c3YodHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzW1siYW5vdmEiXV0sIHR1bW9yX2Rlc2NyaXB0b3JfYW5vdmFfb3V0cGF0aHNbW2ldXSkKICAgIHJlYWRyOjp3cml0ZV90c3YodHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzW1sidHVrZXkiXV0sIHR1bW9yX2Rlc2NyaXB0b3JfdHVrZXlfb3V0cGF0aHNbW2ldXSkKICAKICAgICMgcHJpbnQgcmVzdWx0cyBmb3Igdmlld2luZwogICAgcHJpbnQocm5hX2xpYnJhcnkpCiAgICBwcmludChoZWFkKHR1bW9yX2Rlc2NyaXB0b3JfbW9kZWxfcmVzdWx0cykpCiAgCiAgICAjIyMjIyMjIyMjIyMjIyMjIHBsb3QgcmVzdWx0cyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIyMjIyMjIHR1a2V5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIAogIAogICAgdGRfbW9kZWxzIDwtIHVuaXF1ZShhcy5jaGFyYWN0ZXIodHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzW1sidHVrZXkiXV0kY29tcGFyaXNvbikpCiAgICB0ZF9tb2RlbHMgPC0gc29ydCh0ZF9tb2RlbHMsIGRlY3JlYXNpbmcgPSBGQUxTRSkKICAgIHByaW50KHRkX21vZGVscykKICAKICAgIGZvcih0IGluIHNlcV9hbG9uZyh0ZF9tb2RlbHMpKXsKICAgICAgcHJpbnQodCkKCiAgICAgICMgUmUtb3JkZXIgYmFycwogICAgICBkZiA8LSB0dW1vcl9kZXNjcmlwdG9yX21vZGVsX3Jlc3VsdHNbWyJ0dWtleSJdXSAlPiUKICAgICAgICBmaWx0ZXIoY29tcGFyaXNvbiA9PSB0ZF9tb2RlbHNbdF0pICU+JSAKICAgICAgICBtdXRhdGUoaGFsbG1hcmtfbmFtZV9pZCA9IHBhc3RlMChoYWxsbWFya19uYW1lLCAxOjUwKSkKICAKICAgICAgZGYkaGFsbG1hcmtfbmFtZSA8LSBmYWN0b3IoZGYkaGFsbG1hcmtfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gcmV2KHVuaXF1ZShkZiRoYWxsbWFya19uYW1lW29yZGVyKGRmJHR1a2V5X3BfdmFsdWUsIGRlY3JlYXNpbmcgPSBUUlVFKV0pKSkgIyBGYWN0b3IgbGV2ZWxzIGluIGluY3JlYXNpbmcgb3JkZXIKCiAgICAgICMjIyMjIyBiYXJwbG90cyAjIyMjIyMjIyMjIwogICAgICBuYW1lIDwtIHBhc3RlMChiYXJwbG90c19kaXIsICIvIiwgImdzdmFfdHVrZXlfIiwgcm5hX2xpYnJhcnlfbGlzdFtpXSwgIi0iLCB0ZF9tb2RlbHNbdF0sICItdHVtb3JfZGVzY3JpcHRvcl9iYXJwbG90LnBkZiIpCiAgICAgIHByaW50KG5hbWUpCiAgICAgIHAgPC0gY3JlYXRlX2JhcnBsb3QoZGYgPSBkZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X3ZhbHVlID0gZGYkdHVrZXlfcF92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZV92YWx1ZSA9ICJ0dWtleV9wX3ZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBybmFfbGlicmFyeSA9IHJuYV9saWJyYXJ5X2xpc3RbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfbW9kZWxfaWQgPSB0ZF9tb2RlbHNbdF0pCiAgICAgIHBkZihmaWxlID0gbmFtZSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTApCiAgICAgIHByaW50KHApCiAgICAgIGRldi5vZmYoKQogICAgICAKICAgICAgIyMjIyMjIGRvdCBwbG90cyAjIyMjIyMjIyMjIwogICAgICBkb3RwbG90X25hbWUgPC0gcGFzdGUwKGRvdHBsb3RzX2RpciwgIi8iLCAiZ3N2YV90dWtleV8iLCBybmFfbGlicmFyeV9saXN0W2ldLCAiLSIsIHRkX21vZGVsc1t0XSwgIi10dW1vcl9kZXNjcmlwdG9yX2RvdHBsb3QucGRmIikKICAgICAgcHJpbnQoZG90cGxvdF9uYW1lKQogICAgICBwIDwtIGNyZWF0ZV9kb3RwbG90KGRmID0gZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeF92YWx1ZSA9IGRmJGhhbGxtYXJrX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeV92YWx1ZSA9IGRmJHR1a2V5X3BfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVfdmFsdWUgPSAidHVrZXlfcF92YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm5hX2xpYnJhcnkgPSBybmFfbGlicmFyeV9saXN0W2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRkX21vZGVsX2lkID0gdGRfbW9kZWxzW3RdKQogICAgICBwZGYoZmlsZSA9IGRvdHBsb3RfbmFtZSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTApCiAgICAgIHByaW50KHApCiAgICAgIGRldi5vZmYoKQogICAgICAKICAgICAgIyMjIyMjIHZvbGNhbm8gcGxvdHMgIyMjIyMjIyMjIyMKICAgICAgIyBUaGUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnRpYWxseSBwYXRod2F5cyBhcmUgdGhlIG9uZXMgZm91bmQgaW4gdGhlIHVwcGVyLWxlZnQgYW5kIHVwcGVyLXJpZ2h0IGNvcm5lcnMuCiAgICAgICMgQWRkIGEgY29sdW1uIHRvIHRoZSBkYXRhIGZyYW1lIHRvIHNwZWNpZnkgaWYgdGhleSBhcmUgVVAtIG9yIERPV04tIHJlZ3VsYXRlZCAocGF0aHdheV9zY29yZV9kaWZmZXJlbmNlIHJlc3BlY3RpdmVseSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSkKCiAgICAgICMgYWRkIGEgbmV3IGNvbHVtbiAKICAgICAgZGYkcGF0aF9kaWZmIDwtICJOTyIKICAgICAgIyBpZiBwYXRod2F5X3Njb3JlX2RpZmZlcmVuY2UgPiAwIGFuZCB0dWtleV9wX3ZhbHVlIDwgMC4wNSwgc2V0IGFzICJVUCIgCiAgICAgIGRmJHBhdGhfZGlmZltkZiRwYXRod2F5X3Njb3JlX2RpZmZlcmVuY2UgPiAwICYgZGYkdHVrZXlfcF92YWx1ZSA8IDAuMDVdIDwtICJ0b3BfcmFua2VkX2RhdGEiCiAgICAgICMgaWYgcGF0aHdheV9zY29yZV9kaWZmZXJlbmNlIDwgMCBhbmQgdHVrZXlfcF92YWx1ZSA8IDAuMDUsIHNldCBhcyAiRE9XTiIKICAgICAgZGYkcGF0aF9kaWZmW2RmJHBhdGh3YXlfc2NvcmVfZGlmZmVyZW5jZSA8IDAgJiBkZiR0dWtleV9wX3ZhbHVlIDwgMC4wNV0gPC0gImJvdHRvbV9yYW5rZWRfZGF0YSIKICAgICAgIyBDcmVhdGUgbGFiZWxzCiAgICAgIGRmJGxhYmVscyA8LSB3aXRoKGRmLCBpZmVsc2UodHVrZXlfcF92YWx1ZSA8IDAuMDUsIGhhbGxtYXJrX25hbWVfaWQsICIiKSkKICAgICAgCiAgICAgIHZvbGNhbm9fbmFtZSA8LSBwYXN0ZTAodm9sY2Fub19wbG90c19kaXIsICIvIiwgImdzdmFfdHVrZXlfIiwgcm5hX2xpYnJhcnlfbGlzdFtpXSwgIi0iLCB0ZF9tb2RlbHNbdF0sICItdHVtb3JfZGVzY3JpcHRvcl92b2xjYW5vX3Bsb3QucGRmIikKICAgICAgcHJpbnQodm9sY2Fub19uYW1lKQogICAgICBwIDwtIGNyZWF0ZV92b2xjYW5vX3Bsb3QoZGYgPSBkZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlX3ZhbHVlID0gInR1a2V5X3BfdmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5hX2xpYnJhcnkgPSBybmFfbGlicmFyeV9saXN0W2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfbW9kZWxfaWQgPSB0ZF9tb2RlbHNbdF0pCiAgICAgIHBkZihmaWxlID0gdm9sY2Fub19uYW1lLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCkKICAgICAgcHJpbnQocCkKICAgICAgZGV2Lm9mZigpCiAgICAgIAogICAgICAKICAgICAgCiAgICB9CiAgICAKICAgICMjIyMjIyBhbm92YSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAjIyMjIyMgYmFycGxvdHMgIyMjIyMjIyMjIyMgICAgCiAgICBuYW1lIDwtIHBhc3RlMChiYXJwbG90c19kaXIsICIvIiwgImdzdmFfYW5vdmFfIiwgcm5hX2xpYnJhcnlfbGlzdFtpXSwgIi10dW1vcl9kZXNjcmlwdG9yX2JhcnBsb3QucGRmIikKICAgIHByaW50KG5hbWUpCiAgCiAgICAjIFJlLW9yZGVyIGJhcnMKICAgIGRmIDwtIHR1bW9yX2Rlc2NyaXB0b3JfbW9kZWxfcmVzdWx0c1tbImFub3ZhIl1dCiAgICBkZiRoYWxsbWFya19uYW1lIDwtIGZhY3RvcihkZiRoYWxsbWFya19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gcmV2KHVuaXF1ZShkZiRoYWxsbWFya19uYW1lW29yZGVyKGRmJGFub3ZhX3BfdmFsdWUsIGRlY3JlYXNpbmcgPSBUUlVFKV0pKSkgIyBGYWN0b3IgbGV2ZWxzIGluIGluY3JlYXNpbmcgb3JkZXIKICAgIHAgPC0gY3JlYXRlX2JhcnBsb3QoZGYgPSBkZiwKICAgICAgICAgICAgICAgICAgICAgICAgeV92YWx1ZSA9IGRmJGFub3ZhX3BfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlX3ZhbHVlID0gImFub3ZhX3BfdmFsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgcm5hX2xpYnJhcnkgPSBybmFfbGlicmFyeV9saXN0W2ldLAogICAgICAgICAgICAgICAgICAgICAgICB0ZF9tb2RlbF9pZCA9IE5VTEwpCiAgICBwZGYoZmlsZSA9IG5hbWUsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwKQogICAgcHJpbnQocCkKICAgIGRldi5vZmYoKQogIAogICAgIyMjIyMjIGRvdCBwbG90cyAjIyMjIyMjIyMjIwogICAgZG90cGxvdF9uYW1lIDwtIHBhc3RlMChkb3RwbG90c19kaXIsICIvIiwgImdzdmFfYW5vdmFfIiwgcm5hX2xpYnJhcnksICItdHVtb3JfZGVzY3JpcHRvcl9kb3RwbG90LnBkZiIpCiAgICBwcmludChkb3RwbG90X25hbWUpCiAgICBwIDwtIGNyZWF0ZV9kb3RwbG90KGRmID0gdHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzW1siYW5vdmEiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHhfdmFsdWUgPSB0dW1vcl9kZXNjcmlwdG9yX21vZGVsX3Jlc3VsdHNbWyJhbm92YSJdXSRoYWxsbWFya19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICB5X3ZhbHVlID0gdHVtb3JfZGVzY3JpcHRvcl9tb2RlbF9yZXN1bHRzW1siYW5vdmEiXV0kYW5vdmFfcF92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVfdmFsdWUgPSAiYW5vdmFfcF92YWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJuYV9saWJyYXJ5ID0gcm5hX2xpYnJhcnlfbGlzdFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGRfbW9kZWxfaWQgPSBOVUxMKQogICAgcGRmKGZpbGUgPSBkb3RwbG90X25hbWUsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwKQogICAgcHJpbnQocCkKICAgIGRldi5vZmYoKQogICAgfQp9CmBgYAoKCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoK